package top.xchch.tool.cipher.atguigu;

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 消息摘要算法 为了防止篡改
 */
public class DigestDemo06 {

    public static void main(String[] args) throws NoSuchAlgorithmException {
        // 原文
        String input = "aa";
        // 算法
        String algorithm = "MD5";
        String digestTxt = getDigest(input, algorithm);
        System.out.println(digestTxt); // 4124bc0a9335c27f086f24ba207a4912

        String algorithm2 = "SHA-512";
        String digestTxt2 = getDigest(input, algorithm2);
        System.out.println(digestTxt2); // f6c5600ed1dbdcfdf829081f5417dccbbd2b9288e0b427e65c8cf67e274b69009cd142475e15304f599f429f260a661b5df4de26746459a3cef7f32006e5d1c1

    }

    private static String getDigest(String input, String algorithm) throws NoSuchAlgorithmException {
        // 创建消息摘要对象
        MessageDigest instance = MessageDigest.getInstance(algorithm);
        // 执行消息摘要算法
        byte[] digest = instance.digest(input.getBytes());
//        // 使用base64进行转码
//        String digestTxt = Base64.encode(digest);
//        System.out.println(digestTxt); // QSS8CpM1wn8IbyS6IHpJEg==

        // MD5加密后的结果需要是16进制的字符串
        StringBuilder sb = new StringBuilder();
        for (byte b : digest) {
            // 把密文转换成16进制
            String s = Integer.toHexString(b & 0xff);
            // 判断如果密文的长度是1, 需要在高位进行补0
            if (s.length() == 1) {
                s = "0" + s;
            }
            sb.append(s);
        }
        return sb.toString();
    }
}
